from functools import reduce


# 高阶函数
def power(n):
    return n * n


# map 将传入的函数依次作用到序列中的每个元素
# 并把结果生成新的序列进行返回
l1 = [1, 2, 3, 4, 5]
m = map(power, l1)
print(list(m))


def my_add(x, y):
    return x * 2 + y


# reduce 引入的函数必须有两个参数，然后进行参数的叠加
# 1*2+2=4
# 4*2+3=11
# 11*2+4=26
# 26*2+5=57
r = reduce(my_add, l1)
print(r)


# filter 过滤序列 一个函数，一个序列。返回一个过滤后的序列
def is_odd(n):
    return n % 2 == 1


f = filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
for i in f:
    print(i)

# sorted函数，可以通过key决定规则（可以百度看一下）


# 返回函数
def calc_sum(*args):
    a = 0
    for n in args:
        a = a+n
    return a


def lazy_sum(*args):
    def calc_sum():
        a = 0
        for n in args:
            a = a+n
        return a
    return calc_sum


# 这里l2返回的是一个函数
l2 = lazy_sum(1, 3, 5, 7, 9)
# res调用了l2这个函数
res = l2()
print(res)
